#ifndef BSP_TAMAGAWA_H
#define BSP_TAMAGAWA_H

#include "main.h"

extern UART_HandleTypeDef *tg_uart;
/* 定义多摩川协议中的 CRC8 多项式 */
#define TAMAGAWA_CRC8_POLY 0x07

#define TAMAGAWA_DE_GPIO_Port   GPIOB
#define TAMAGAWA_DE_Pin         GPIO_PIN_15
#define TAMAGAWA_RE_GPIO_Port   GPIOB
#define TAMAGAWA_RE_Pin         GPIO_PIN_14

/* 编码器的状态字节位定义 */
#define TAMAGAWA_ERR_SINGLE_TURN    (1 << 0)  // 单圈计数错误
#define TAMAGAWA_ERR_OVERTEMP       (1 << 1)  // 超温
#define TAMAGAWA_ERR_COUNT_ERROR    (1 << 2)  // 计圈错误
#define TAMAGAWA_ERR_BATTERY_ALARM (1 << 3)  // 电池报警
#define TAMAGAWA_ERR_BATTERY_ERROR (1 << 4)  // 电池错误
#define TAMAGAWA_ERR_PARITY_ERROR  (1 << 5)  // 通讯奇偶校验错误
#define TAMAGAWA_ERR_STOP_BIT_ERROR (1 << 6)  // 通讯停止位错误

#define UART_DMA_BUF_SIZE   (256)
#define TAMAGAWA_MAX_THETA  (2097152.0f)
// #define TAMAGAWA_MAX_THETA  (131072.0f)
#define TAMAGAWA_CNT_NULL   (0xFFFFFFFF)

/* 编码器的状态结构体定义 */
typedef struct {
    uint8_t CF;    // 命令字节
    uint8_t SF;    // 状态字节
    uint32_t ABS;  // 单圈数据值
} Tamagawa_ABSDataTypeDef;

typedef struct {
    uint8_t CF;    // 命令字节
    uint8_t SF;    // 状态字节
    uint32_t ABM;  // 圈数数据值
} Tamagawa_ABMDataTypeDef;

typedef struct {
    uint8_t CF;    // 命令字节
    uint8_t SF;    // 状态字节
    uint32_t ABS;  // 单圈数据值
    uint8_t ENID;  // 编码器ID
    uint32_t ABM;  // 圈数数据值
    uint8_t ALMC;  // 故障内容字节
} Tamagawa_FullDataTypeDef;

typedef struct {
    uint8_t CF;    // 命令字节
    uint8_t SF;    // 状态字节
    uint8_t ID;    // 编码器ID
} Tamagawa_ModelVerTypeDef;

typedef struct {
    uint8_t CF;    // 命令字节
    uint8_t SF;    // 状态字节
    uint32_t DF;    // 编码器ID
} Tamagawa_ResetAbsTypeDef;
/* 定义多摩川协议的状态类型 */
typedef enum {
    TAMAGAWA_OK = 0,
    TAMAGAWA_ERR,
    TAMAGAWA_TIMEOUT,
    TAMAGAWA_CRC_ERR,
    TAMAGAWA_PROCESSING,
    TAMAGAWA_CMD_INVAILD,
} Tamagawa_StatusTypeDef;

typedef enum
{
    GET_ID = 0x92,
    GET_ALL = 0x1A,
} Tamagawa_CMD_Type;

// 数据接收结构体
typedef struct {
    uint8_t processingFlag;    // 数据处理中 标志
    uint8_t dma_rx_buf[UART_DMA_BUF_SIZE];  // DMA接收缓冲区
    Tamagawa_CMD_Type sendCmdType;  // 记录已发送的指令类型
    Tamagawa_FullDataTypeDef fullData;
    uint32_t timeout_cnt;                   // 超时计数器
    float encoder_theta;
} Tamagawa_UartCommTypeDef;

/* 函数声明 */
void Tamagawa_Init(UART_HandleTypeDef *huart);
uint8_t Tamagawa_CRC8(const uint8_t *p, uint16_t len);
Tamagawa_StatusTypeDef Tamagawa_ReadABS(Tamagawa_ABSDataTypeDef *out, uint32_t timeout);
Tamagawa_StatusTypeDef Tamagawa_ReadModelID(Tamagawa_ModelVerTypeDef *out, uint32_t timeout);
Tamagawa_StatusTypeDef Tamagawa_ReadFull(Tamagawa_FullDataTypeDef *out, uint32_t timeout);
Tamagawa_StatusTypeDef Tamagawa_ReadError(Tamagawa_ResetAbsTypeDef *out,uint32_t timeout);
Tamagawa_StatusTypeDef Tamagawa_StartCheck(void);
Tamagawa_StatusTypeDef Tamagawa_SendCmd(Tamagawa_CMD_Type cmd);
uint8_t get_CmdResponseLength(Tamagawa_CMD_Type cmd);
void Tamagawa_Timer(void);


extern Tamagawa_UartCommTypeDef tg_comm;


#endif /* BSP_TAMAGAWA_H */
